#include <iostream>
#include <string>
#include <vector>
using namespace std;

#include <unistd.h>
#include <signal.h>
#define MAX_SIGNAL 31

static vector<int> sigarr = {2, 3};

static void show(const sigset_t &pending)
{
    for (int signo = MAX_SIGNAL; signo >= 1; signo--)
    {
        if (sigismember(&pending, signo))
            cout << "1";
        else
            cout << "0";
    }
    cout << endl;
}

static void myhandler(int signo)
{
    cout << "信号编号:" << signo << "的信号被递达!" << endl;
}

int main()
{
    // 设置信号默认行为
    for (const auto &signo : sigarr)
        signal(signo, myhandler);

    // 1.先尝试屏蔽指定的信号
    sigset_t block, oldblock, pending;
    // 1.1初始化
    sigemptyset(&block);
    sigemptyset(&oldblock);
    sigemptyset(&pending);
    // 1.2添加要屏蔽的信号
    for (const auto &signo : sigarr)
    {
        sigaddset(&block, signo);
    }

    //(到这里没有屏蔽信号，只是预定信息)
    // 1.3 屏蔽（设置进入内核）
    sigprocmask(SIG_SETMASK, &block, &oldblock);

    // 2.遍历打印Pending信号集
    int cnt = 5;
    while (true)
    {
        // 2.1初始化
        sigemptyset(&pending);
        // 2.2获取pending表
        sigpending(&pending);
        // 2.3
        show(pending);
        sleep(1);

        if (cnt-- == 0)
        {
            cout << "解除对信号的屏蔽,成为不屏蔽任何信号" << endl;
            sigprocmask(SIG_SETMASK, &oldblock, &block);
            //信号递达后恢复屏蔽
            sigprocmask(SIG_SETMASK, &block, &oldblock); 
            cnt = 5;
        }
    }
    return 0;
}